
const cors = require('cors')
const express = require('express');
const compression = require('compression');
const bodyParser = require('body-parser');
const { OutputLogger, logger } = require('./error.js');
const { validatePostRequest } = require('./post.js');
const swaggerConfig = require('../swagger'); // 引入Swagger配置
const { level } = require('winston');

function registerMiddleware (app) {
  // 压缩响应体
  app.use(compression({ filter: shouldCompress,level: 6 }));
 
  function shouldCompress(req, res) {
    if (req.headers['x-no-compression']) {
      return false;
    }
    return compression.filter(req, res)
  }
 // 解析请求体req.body参数
 app.use(express.json());
 // 解析URL编码的请求体
 app.use(express.urlencoded({ extended: true }));
 //配置body-parser中间件  解析post请求体
 // parse application/x-www-form-urlencoded
 // app.use(bodyParser.urlencoded({ extended: false }))
 // parse application/json
//  app.use(bodyParser.json({ type: 'application/*+json' }));
 // 使用 cors 中间件 配置要在 bodyParser 使用后，否则无法读取到 req.headers
 var corsOptions = function (req, callback) {
  let rawHeaders = req.headers['host'];
  if (!req || config.whitelist.indexOf(rawHeaders) !== -1) {
   callback(null, true)
  } else {
   callback(new Error('Not allowed by CORS'))
  }
 }
 // 使用Swagger UI中间件
 // 开放相关接口，获取swagger配置参数
 var swaggerJson = function (req, res) {
  res.setHeader("Content-Type", "application/json");
  res.send(swaggerConfig.specs);
}
 // app.get("/swagger.json", swaggerJson);
 app.use('/api-docs', swaggerConfig.serve, swaggerConfig.setup);
 // 配置多个页面就调用多个配置
 // app.use('/swagger', swaggerConfig.serve, swaggerConfig.setup);

 // 若不传参数corsOptions就是允许跨域访问，也可以对单个路由进行配置
 // 更多参考：https://github.com/expressjs/cors#readme
 // app.use(cors(corsOptions));
 app.use(cors())
 // 错误日志
 app.use(OutputLogger);
 // 监听 post 方式中间件
 app.use(validatePostRequest);
 //! 监听错误此方式不行
 // app.use((err, req, res, next) => {
 //  console.error(err.stack);
 //  process.on('unhandledRejection', (err, promise) => {
 //   console.error('Unhandled Rejection:', err);
 //   // 你可以在这里添加日志记录、告警等
 //   res.status(500).send('Something broke!');
 //  });
 // });
}



module.exports = registerMiddleware